home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 41 / Amiga Format CD41 (1999-06)(Future Publishing)(GB)[!][issue 1999-07].iso / -seriously_amiga- / cd-rom / acdb / src / addb_hosts.e < prev    next >
Text File  |  1999-04-28  |  7KB  |  294 lines

  1. OPT OSVERSION=37,LARGE
  2. OPT PREPROCESS,REG=5
  3.  
  4.  
  5. /*
  6.  *-- AutoRev header do NOT edit!!
  7.  *
  8.  *   Project         :   AMIGA CD [DATA] BASE - program obsîugujâcy CDDB
  9.  *   File            :   acdb_hosts.e
  10.  *   Description     :   wyôwietla listë serwerów CDDB
  11.  *   Copyright       :   ©1999, Piotr Gapiïski
  12.  *   Author          :   Piotr Gapiïski
  13.  *   Creation Date   :   25.03.99
  14.  *   Current version :   1.1
  15.  *   Translator      :   AmigaE v3.3a
  16.  *
  17.  *-- REVISION HISTORY
  18.  *
  19.  *   1.1 (25.03.99)
  20.  *    o   parametry podczas wywoîywania programu
  21.  *    o   moûliwoôê przerwania dziaîania programu przez naciôniëcie CTRL-C
  22.  *
  23.  *   1.0 (10.01.99)
  24.  *    o   pierwsza wersja
  25.  *    o   zmieniony parser z AFC/PARSER na wîasnâ produkcjë
  26.  *    o   program mógî zawiesiê komputer gdyby nie wykryî bsdsocket.library
  27.  *
  28.  *-- REV_END --*
  29.  */
  30.  
  31.  
  32.   MODULE 'bsdsocket','tools/file','dos/dos','dos/rdargs'
  33.   MODULE '*acdb_net'
  34.  
  35.  
  36.   #define DEF_HOST 'www.cddb.com'
  37.   #define PORT 80
  38.  
  39.     CONST MAXBUF = 10240
  40.      ENUM ARG_HOST, NUMARGS
  41.  
  42.  
  43. PROC main() HANDLE
  44.   DEF sd=-1, buf=NIL:PTR TO CHAR, bytes, rc=RETURN_FAIL, code
  45.   DEF rdargs=NIL, args:PTR TO LONG, host
  46.   VOID '$VER: acdb_hosts 1.1 (25.03.99) ©1999, Piotr Gapinski'
  47.  
  48.   NEW args[NUMARGS]
  49.   rdargs := ReadArgs('HOST', args, NIL)
  50.   IF (rdargs)
  51.  
  52.     ->-
  53.     ->- parametry przekazana przez CLI
  54.     ->-
  55.  
  56.     host := args[ARG_HOST]
  57.   ENDIF
  58.   IF (host = NIL) THEN host := DEF_HOST
  59.  
  60.   IF (socketbase := OpenLibrary('bsdsocket.library', 4))=NIL
  61.  
  62.     ->-
  63.     ->- brak biblioteki
  64.     ->-
  65.  
  66.     WriteF('cannot open bsdsocket.library v4+!\n')
  67.     Raise()
  68.   ENDIF
  69.  
  70.   buf := New(MAXBUF)
  71.   WriteF('connecting to \s:\d\n', host, PORT)
  72.   IF (sd := netConnect(host, PORT)) >= 0
  73.  
  74.     ->-
  75.     ->- poîâczenie nawiâzane, wyôlij zapytanie
  76.     ->- zapytanie zawiera informacje dotyczâce miëdzy innymi autora programu, nazwy
  77.     ->- programu, jego wersji oraz suportowanym poziomie komend (proto)
  78.     ->-
  79.  
  80.     WriteF('OK, now sending query string\n')
  81.     IF netSendcmd(sd, '/~cddb/cddb.cgi?cmd=sites&hello=narg+polbox.com+acdb+1.0&proto=4')<>FALSE
  82.  
  83.       ->-
  84.       ->- ciâgle jest OK.
  85.       ->-
  86.  
  87.       WriteF('OK, reading\n')
  88.       IF (bytes := receive(sd, buf, MAXBUF))>0
  89.         code := Val(buf)
  90.         IF (code = 210)
  91.  
  92.           ->-
  93.           ->- udaîo sië coô odebraê, wyôwietlaj!
  94.           ->-
  95.  
  96.           WriteF('Done!\n\n')
  97.           IF showsites(buf, bytes)=FALSE THEN WriteF('Unknown error!\n') ELSE rc := RETURN_OK
  98.         ELSE
  99.  
  100.           ->-
  101.           ->- bîâd zwrócony przez CDDB
  102.           ->-
  103.  
  104.           WriteF('cddb error (code: \d)!\n',code)
  105.         ENDIF
  106.       ELSE
  107.         WriteF('cannot read data from host!\n')
  108.       ENDIF
  109.     ELSE
  110.       WriteF('connection broken!\n')
  111.     ENDIF
  112.     CloseSocket(sd)
  113.   ELSE
  114.     WriteF('cannot resolve CDDB host address!\n')
  115.   ENDIF
  116.  
  117. EXCEPT DO
  118.   IF (rdargs) THEN FreeArgs(rdargs)
  119.   END args
  120.   IF (buf) THEN Dispose(buf)
  121.   IF (socketbase) THEN CloseLibrary(socketbase)
  122. ENDPROC rc
  123.  
  124.  
  125.  
  126. OBJECT parse
  127.   command       :PTR TO CHAR
  128.   template      :PTR TO CHAR
  129.   func          :LONG
  130. ENDOBJECT
  131.  
  132.  
  133.  
  134. PROC showsites(buf:PTR TO CHAR, size) HANDLE
  135.  
  136.   ->-
  137.   ->- procedura dekodujâca dane zawarte w buforze
  138.   ->- format danych poniûej
  139.   ->- zwraca TRUE/FALSE
  140.   ->-
  141.   ->- us.cddb.com cddbp 888 - N039.46 W086.09 Random US site
  142.   ->- us.cddb.com http 80 /~cddb/cddb.cgi N039.46 W086.09 Random US site
  143.   ->-
  144.  
  145.   DEF rda=NIL:PTR TO rdargs
  146.   DEF list:PTR TO LONG, listlen, x, rc=TRUE, command
  147.  
  148.   rda:=AllocDosObject(DOS_RDARGS,NIL)
  149.   IF (rda=NIL) THEN Raise()
  150.   rda.flags:=rda.flags OR RDAF_NOPROMPT
  151.  
  152.   ->-
  153.   ->- podziaî bufora na linie
  154.   ->- pierwsza linia zawiera kod zwrotny, ostatnia zawiera kropkë - moûna je pominâê
  155.   ->-
  156.  
  157.   list := stringsinfile(buf, size, countstrings(buf, size))
  158.   listlen := ListLen(list)
  159.   IF (listlen < 3) THEN Raise()
  160.  
  161.   ->-
  162.   ->- dla kaûdej linii dekoduj
  163.   ->-
  164.  
  165.   command := [NIL,'ADDR,PROTOCOL,PORT/N,CGI,LOCATION/F',{func}]:parse
  166.   FOR x := 1 TO (listlen - 2) DO rc := rc AND parseCommand(rda, command, ListItem(list, x))
  167.   FreeDosObject(DOS_RDARGS,rda)
  168.   RETURN rc
  169.  
  170. EXCEPT
  171. ENDPROC FALSE
  172.  
  173.  
  174.  
  175. ENUM ARG_ADDR, ARG_PROTOCOL, ARG_PORT, ARG_CGI, ARG_LOCATION
  176. PROC func(args:PTR TO LONG)
  177.  
  178.   ->-
  179.   ->- funkcja pobierajâca dane po przetworzeniu przed ReadArgs()
  180.   ->- i wyôwietlajâca je w CLI
  181.   ->- do funkcji przekazywana jest tablica ûâdanych wartoôci
  182.   ->- zwraca TRUE/FALSE
  183.   ->-
  184.  
  185.   DEF addr, protocol, port, cgi, location, tmp
  186.  
  187.   addr      := args[ARG_ADDR]
  188.   protocol  := args[ARG_PROTOCOL]
  189.   port      := IF (tmp := args[ARG_PORT]) THEN ^tmp ELSE 80
  190.   cgi       := args[ARG_CGI]
  191.   location  := args[ARG_LOCATION]
  192.  
  193.   IF (addr) AND (protocol) AND (location)
  194.  
  195.     ->-
  196.     ->- wyôwietlaj tylko serwery suportujâce HTTP
  197.     ->-
  198.  
  199.     LowerStr(protocol)
  200.     IF StrCmp('http',protocol) THEN WriteF('\s:\d, \s\n', addr, port, location)
  201.   ENDIF
  202. ENDPROC TRUE
  203.  
  204.  
  205.  
  206. PROC parseCommand(rda:PTR TO rdargs,parser:PTR TO parse,str:PTR TO CHAR) HANDLE
  207.  
  208.   ->-
  209.   ->- procedura zajmujâca sië obróbkâ (rozbiciem) parametrów w linii znaków
  210.   ->-
  211.  
  212.   DEF rd,i=0,char,func,len
  213.   DEF args:PTR TO LONG,nargs=0,rc=FALSE
  214.   DEF buffer
  215.  
  216.   ->-
  217.   ->- gdy nie potrzeba argumentów
  218.   ->- wywoîaj funkcjë bezpoôrednio
  219.   ->-
  220.  
  221.   func:=parser.func
  222.   IF (parser.template=NIL) THEN RETURN func()
  223.  
  224.   ->-
  225.   ->- w przeciwnym razie policz ile funkcja potrzebuje argumentów
  226.   ->-
  227.  
  228.   WHILE (char:=parser.template[i++]) DO IF char="," THEN nargs++
  229.   nargs++
  230.   NEW args[nargs]
  231.  
  232.   ->-
  233.   ->- przygotuj bufor
  234.   ->- dane nie mogâ sië koïczyê znakiem /0 tylko /n!
  235.   ->-
  236.  
  237.   len := StrLen(str)
  238.   buffer := String(len + 10)
  239.   StrCopy(buffer, str)
  240.   buffer[len] := "\n"
  241.   buffer[len+1] :="\0"
  242.  
  243.   rda.source.buffer := buffer
  244.   rda.source.length := len + 1
  245.   rda.source.curchr := 0
  246.   rda.dalist := NIL
  247.   rda.buffer := NIL
  248.  
  249.   rd:=ReadArgs(parser.template, args, rda)
  250.   IF (rd)
  251.  
  252.     ->-
  253.     ->- wywoîaj odpowiedniâ funkcjë
  254.     ->-
  255.  
  256.     rc:=func(args)
  257.     FreeArgs(rd)
  258.   ENDIF
  259.  
  260. EXCEPT DO
  261.   DisposeLink(buffer)
  262.   END args[nargs]
  263. ENDPROC rc
  264.  
  265.  
  266.  
  267. PROC receive(sd, buff:PTR TO CHAR, max)
  268.  
  269.   ->-
  270.   ->- odbiera max bajtów do bufora w paczkach po 100 bajtów
  271.   ->- odbiór moûna przerwaê wysyîajâc do tasku programu sygnaî CTRL-D
  272.   ->- zwraca TRUE/FALSE (TRUE gdy wszystkie dane zostaîy odebrane)
  273.   ->-
  274.  
  275.   DEF len=0, i=0
  276.  
  277.   SetSignal(0, SIGBREAKF_CTRL_C)
  278.   WHILE TRUE
  279.     EXIT (len > max)
  280.  
  281.     i := Recv(sd, (buff + len), 100, 0)
  282.     EXIT (i<=0)
  283.  
  284.     len := len + i
  285.     IF (SetSignal(0, SIGBREAKF_CTRL_C) AND SIGBREAKF_CTRL_C) THEN RETURN 0
  286.   ENDWHILE
  287.  
  288.   ->-
  289.   ->- i=0 oznacza koniec odbioru
  290.   ->-
  291.  
  292.   IF (len > max) OR (i < 0) THEN RETURN FALSE
  293. ENDPROC len
  294.